/**
 * 给定N个物品，每个物品有花费wi，有两种价值hi和bi
 * 现在要求这N个物品中有的放在h收获hi，有的放在b收获bi，
 * 必须要满足条件 h中的所有花费 <= b中的所有花费
 * 求此条件下的最大收益
 * 特别的所有物品均放在b是允许的
 * 令 Div是选到i且花了v在h的最大收益（其余没有放在h的自然就放在b中了）
 * 注意到 D[0][0] = 所有bi之和
 * 所以对于第i件物品只有两种选择，如果不选，则该物品依然做出bi的贡献（什么都不用做）
 * 如果选了则该物品需要撤回bi的贡献转而贡献hi，因此
 * div = max(d[i - 1][v], d[i - 1][v - wi] + hi - bi)
 * 然后注意满足限制条件即可
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<llt>;
using vvi = vector<vi>;

int N;
vi W, H, B;

vi D;
int Maxv;

llt chkadd(llt a, llt b){
    if(-1 == a or -1 == b)return -1;
    return a + b;
}

void chkmax(llt & d, llt a){
    if(-1 == a) return;
    if(-1 == d or d < a) return(void)(d = a);
}

void work(){
    cin >> N;
    W.assign(N + 1, 0);
    H.assign(N + 1, 0);
    B.assign(N + 1, 0);
    for(int i=1;i<=N;++i) cin >> W[i] >> H[i] >> B[i];
    
    Maxv = accumulate(W.begin(), W.end(), 0);
    auto totalHapyOfBody = accumulate(B.begin(), B.end(), 0LL);

    D.assign(Maxv + 1, -1);
    D[0] = totalHapyOfBody;
    for(int i=1;i<=N;++i){
        auto cost = W[i];
        for(int v=Maxv;v>=cost;--v){
            if(v <= Maxv - v){
                if(D[v - cost] != -1){
                    chkmax(D[v], D[v - cost] + H[i] - B[i]);
                }
            }           
        }
    }
    llt ans = 0;
    for(int i=0;i<=Maxv;++i){
        chkmax(ans, D[i]);
    }
    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
	return 0;
}